#ifndef __RESOURCEHOLDER_H__
#define __RESOURCEHOLDER_H__

#include <map>
#include <string>
#include <memory>
#include <stdexcept>
#include <cassert>

#include "ResourceIDs.h"

/*
	ResourceHolder moze trzymac:
	Textures, SoundBuffers, Shaders, Fonts

	sf::Music ogarnia sie nieco inaczej, wiec tego tutaj nie obsluzymy
*/

template<typename Resource, typename Identifier>
class ResourceHolder
{
	public:
		
		// zaladowanie zasobu z pliku (id - identyfikator/klucz; filename - nazwa pliku;
		// Parameter - np. sf::Shader::Type (dla shaderow) lub const std::string & (dla fontow)):
		void load(Identifier id, const std::string & filename);
		template <typename Parameter>
		void load(Identifier id, const std::string & filename, const Parameter & secondParam);

		// pobranie zasobu za pomoca podanego identyfikatora/klucza:
		Resource & get(Identifier id);
		const Resource & get(Identifier id) const;


	private:
		
		// wrzucenie wczytaego zasobu do mapki:
		void insertResource(Identifier id, std::unique_ptr<Resource> resource);
		
		// mapka z zasobami:
		std::map<Identifier, std::unique_ptr<Resource>>	m_resourceMap;
};

#include "ResourceHolder.inl" // plik inline ("wkleja" tu implementacje metod templatki,
                              // zeby unkiknac bledow linkera/kompilatora)
#endif //__RESOURCEHOLDER_H__